package com.redpack.redpost.struts.form;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

import com.redpack.redpost.util.dao.MercanciaImporteDao;
import com.redpack.redpost.util.dao.TarifaAdminDao;
import com.redpack.redpost.util.to.MercanciaImporteTo;
import com.redpack.redpost.util.to.MultipiezaArriboTo;
import com.redpack.redpost.util.to.TarifaServicioTo;
import com.redpack.redpost.util.to.cotizacionTo;
import com.redpack.vo.xsd.Cotizacion;
import com.redpack.vo.xsd.Direccion;
import com.redpack.vo.xsd.Guia;
import com.redpack.vo.xsd.IdDesc;
import com.redpack.vo.xsd.Paquete;
import com.redpack.ws.RedpackWSPortTypeProxy;


import com.redpack.vo.xsd.Cotizacion;
import com.redpack.vo.xsd.Direccion;
import com.redpack.vo.xsd.Guia;
import com.redpack.vo.xsd.IdDesc;
import com.redpack.vo.xsd.Paquete;
import com.redpack.ws.RedpackWSPortTypeProxy;


public class cotizadorForm extends ActionForm {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int cantidad;
	private int tipo_mercancia;
	private float valor;
	private int unidad;
	private int cp;
	private String seguro;
	private float[] peso;
	private float[] largo;
	private float[] ancho;
	private float[] alto;
	private float[] pesoVol ;
	private int acc;
	
	
	public float[] getPesoVol() {
		return pesoVol;
	}


	public void setPesoVol(float[] pesoVol) {
		this.pesoVol = pesoVol;
	}


	public int getCp() {
		return cp;
	}


	public void setCp(int cp) {
		this.cp = cp;
	}


	public int getCantidad() {
		return cantidad;
	}


	public void setCantidad(int cantidad) {
		this.cantidad = cantidad;
	}


	public int getTipo_mercancia() {
		return tipo_mercancia;
	}


	public void setTipo_mercancia(int tipo_mercancia) {
		this.tipo_mercancia = tipo_mercancia;
	}


	public float getValor() {
		return valor;
	}


	public void setValor(float valor) {
		this.valor = valor;
	}


	public int getUnidad() {
		return unidad;
	}


	public void setUnidad(int unidad) {
		this.unidad = unidad;
	}


	public String getSeguro() {
		return seguro;
	}


	public void setSeguro(String seguro) {
		this.seguro = seguro;
	}


	public float[] getPeso() {
		return peso;
	}


	public void setPeso(float[] peso) {
		this.peso = peso;
	}


	public float[] getLargo() {
		return largo;
	}


	public void setLargo(float[] largo) {
		this.largo = largo;
	}


	public float[] getAncho() {
		return ancho;
	}


	public void setAncho(float[] ancho) {
		this.ancho = ancho;
	}


	public float[] getAlto() {
		return alto;
	}


	public void setAlto(float[] alto) {
		this.alto = alto;
	}


	public int getAcc() {
		return acc;
	}


	public void setAcc(int acc) {
		this.acc = acc;
	}


	public static long getSerialversionuid() {
		return serialVersionUID;
	}


	public ActionErrors validate(ActionMapping mapping, HttpServletRequest request){
		
		ActionErrors errors = new ActionErrors() ;
		
		HttpSession session = request.getSession( ) ;
		String idioma = "";
		boolean inCompleto = false ;
		
		try {
			List mercancias = MercanciaImporteDao.getMercancias( );//.getMercancias();
	   		request.setAttribute("mercancias", mercancias);
		}
		catch( Exception e ) {
			
			e.printStackTrace( ) ;
		}	
		
	
		if (session.getAttribute("idioma") != null && session.getAttribute("idioma") != ""){
			idioma = session.getAttribute("idioma").toString();
	
		}
		
		if( acc == 1 ) {
			
			cotizadorForm f = new cotizadorForm( ) ;	
			
			f.setCantidad(cantidad);
			f.setTipo_mercancia(tipo_mercancia) ;
			f.setValor(valor);
			f.setUnidad(unidad);
			f.setCp(cp);
			f.setSeguro(seguro);
			f.setPeso(peso);
			f.setLargo(largo);
			f.setAncho(ancho);
			f.setAlto(alto);
			f.setPesoVol(pesoVol) ;
			double pesoT = 0;
			if( cp == 0  ){
				
				f.setAcc(0) ;
				request.setAttribute("Form", f) ;
				
				if(idioma.equals("")){
					errors.add("cpVacio", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.cp")) ;
				}
				if(idioma.equals("Eng")){
					errors.add("cpVacio", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.cpEng")) ;
				}
				
			}else
				if( tipo_mercancia == 0  ){
					
					f.setAcc(0) ;
					request.setAttribute("Form", f) ;
					
					if(idioma.equals("")){
						errors.add("tipoVacio", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.tipoM")) ;
					}
					if(idioma.equals("Eng")){
						errors.add("tipoVacio", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.tipoMEng")) ;
					}
					
				}else if( tipo_mercancia == 3 && valor > 50 ){
					
					f.setAcc(0) ;
					request.setAttribute("Form", f) ;
					
					if(idioma.equals("")){
						errors.add("valorError", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.valorError")) ;
					}
					if(idioma.equals("Eng")){
						errors.add("valorError", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.valorErrorEng")) ;
					}
					
				}else if( ( tipo_mercancia == 4 ) && ( valor < 50 || valor > 1000 ) ){
					
					f.setAcc(0) ;
					request.setAttribute("Form", f) ;
					
					if(idioma.equals("")){
						errors.add("valorErrorDos", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.valorErrorDos")) ;
					}
					if(idioma.equals("Eng")){
						errors.add("valorErrorDos", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.valorErrorDosEng")) ;
					}
					
				}else
					if( cantidad == 0 ){
						
						f.setAcc(0) ;
						request.setAttribute("Form", f) ;
						
						if(idioma.equals("")){
							errors.add("cantidadVacio", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.cantidad")) ;
						}
						if(idioma.equals("Eng")){
							errors.add("cantidadVacio", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.cantidadEng")) ;
						}
						
					}else
						if( valor < 0.1 && tipo_mercancia != 1 ){
							
							f.setAcc(0) ;
							request.setAttribute("Form", f) ;
							
							if(idioma.equals("")){
								errors.add("valorVacio", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.valor")) ;
							}
							if(idioma.equals("Eng")){
								errors.add("valorVacio", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.valorEng")) ;
							}
							
							
						}else{
							
							
							for( int i = 0 ; i < peso.length ; i++ ){
								if(peso[ i ] == 0 || alto[ i ] == 0 || ancho[ i ] == 0 || largo[ i ] == 0 ){
									inCompleto = true ;
									pesoT += peso[ i ];
									break ;
								}
							}
							
							
							if( inCompleto && tipo_mercancia != 3 && tipo_mercancia != 1 ){
								
								f.setAcc(0) ;
								request.setAttribute("Form", f) ;
								
								if(idioma.equals("")){
									errors.add("medidasVacio", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.medidas")) ;
								}
								if(idioma.equals("Eng")){
									errors.add("medidasVacio", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.medidasEng")) ;
								}
								
							}
							
						}
			
						if( unidad == 2 ){
							pesoT = pesoT * 0.45359237;
						}
						
						if( pesoT > 50 && tipo_mercancia == 1 ){
							request.setAttribute("Form", f) ;
							if(idioma.equals("")){
								errors.add("pesoDocus", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.pesodocus")) ;
							}
							if(idioma.equals("Eng")){
								errors.add("pesoDocus", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.pesodocusEng")) ;
							}
						}
			
			
			
			//Obtener Paquetes
			if(cantidad > 0){
				if(peso != null && largo != null && ancho != null && alto != null){
					float[][] paquetes = new float[cantidad][5];
					try {
						
					    Paquete paketes[] = new Paquete[cantidad];
					    
					    
					    float[] pesos = peso;
					    float[] altos = largo;
					    float[] anchos = ancho;
					    float[] largos = alto;
					    float[] pesosVol = pesoVol ;
			        	
				    	for( int i = 0; i<cantidad; i++ ){
					    	
					    	Paquete pakete = new Paquete( ) ;
				        	
				        	pakete.setAlto( new Integer ( (int) altos[ i ] ) ) ;
				        	pakete.setAncho( new Integer ( (int) anchos[ i ] ) ) ;
				        	pakete.setLargo( new Integer ( (int) largos[ i ] ) ) ;
				        	pakete.setPeso( Float.valueOf( "" + pesos[ i ] ) ) ;
				        	float pv = pesosVol[i] ;
				        	
				        	paketes[ i ] = pakete;
				        	
				        	for(int j = 0;j < 5;j++){ //Filas
					        		if(j == 0){
				        				paquetes[i][j]= pakete.getPeso().floatValue();
				        			}
					        		if(j == 1){
					        			paquetes[i][j]= pakete.getLargo().floatValue();
				        			}
				        			if(j == 2){
				        				paquetes[i][j]= pakete.getAncho().floatValue();
				        			}
				        			if(j == 3){
				        				paquetes[i][j]= pakete.getAlto().floatValue();
				        			}
				        			if(j == 4){
				        				paquetes[i][j]= pv ;
				        			}
					        	}
					    }
				    	

				    	request.setAttribute("paquetes", paquetes);
		    		
				    	//VALIDAR CP
			    		if( !ValidarCP( paketes[ 0 ] ) && inCompleto == false ){
			    			
			    			f.setAcc(0) ;
							request.setAttribute("Form", f) ;
			    			
							if(idioma.equals("")){
								errors.add("cpValido", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.cpValido")) ;
							}
							if(idioma.equals("Eng")){
								errors.add("cpValido", new ActionMessage("com.redpack.redpost.web.errors.modules.cotizador.cpValidoEng")) ;
							}
							
			    		}
					}
					catch( Exception e ) {
						
						e.printStackTrace( ) ;
					}
				}
		}
		
			
	
		}
		return errors ;
}
	
	
	public boolean ValidarCP(Paquete _paketes){
		
		boolean res = false;
		
		try {
			
		
		Paquete paketes[] = new Paquete[ 1 ] ;
		paketes[ 0 ] = _paketes ;
		
		String pin = "QA 8QneHpMUiZh582FqkQjhB03WTYDK9royyF+1zh2APEs=";
		String idUser =  "17" ;
		
		RedpackWSPortTypeProxy proxy = new RedpackWSPortTypeProxy();
        Guia a[] = new Guia[1];
        Guia g = new Guia();
                          
        IdDesc entrega = new IdDesc();
        entrega.setId(new Integer(1));
        g.setTipoEntrega(entrega);
        
        Direccion consignatario = new Direccion();
        consignatario.setCodigoPostal(new Integer ( cp ) ) ;
        g.setConsignatario(consignatario);
        
        Direccion remitente = new Direccion( ) ;
        remitente.setCodigoPostal( new Integer ( 6100 ) ) ;
        g.setRemitente(remitente);
        	        
        g.setPaquetes(paketes);
        
        a[0]= g;

        a = proxy.cotizacionNacional(pin, new Integer(idUser), a);
//        Resultado resultados[] =  a[0].getResultadoConsumoWS();
        
		        if( a[ 0 ].getCotizaciones( ).length > 0 ){// si hay cotizaciones INI
		        	
		        	Cotizacion ctz[ ] = a[ 0 ].getCotizaciones( ) ;
		        	ArrayList servicios = new ArrayList( ) ;
		        	
		        	for( int y = 0 ; y < ctz.length ; y++ ){
		        		
		        		if( ctz[ y ] == null )
		        			continue ;
		        		
		        		if( ctz[ y ].getTipoServicio( ).getDescripcion( ).equals("EXPRESS") || 
		        				ctz[ y ].getTipoServicio( ).getDescripcion( ).equals("ECOEXPRESS") ){
		        			servicios.add( ctz[ y ].getTipoServicio( ).getDescripcion( ) ) ;
		        		}
		        		
		        	}
		        	
		        	cotizacionTo cotizacion[ ] = new cotizacionTo[ servicios.size( ) ] ;
		        	
		        	
		        	if( cotizacion.length > 0 ){
		        		res = true;
		        	}
	
			}
		}
		catch( Exception e ) {
			e.printStackTrace( ) ;
		}
        return res;
	}
}